/** ***********************************************************************************
* @file         mcu_task.c
* @brief        MCU通信数据管理任务头文件
* @details      主要是用来处理MCU与CPU之间的串口通信协议处理，以及接口输出。
* @author       杨小珛
* @date         2020/12/24
* @copyright    北京高知科技有限公司    
* @version      V1.0
* @attention    无
**************************************************************************************/

#ifndef MCU_TASK_H
#define MCU_TASK_H

#include "os_app.h"
#include "mcu_data_format.h"

#define MCU_UART_PORT ( 0 )     /*MCU串口号*/

typedef void (*mcu_uart_driver_callback_t)( uint8_t *data, uint16_t len );
typedef void (*mcu_uart_state_callback_t)( uint8_t state );

/****************************创建SOCKET 连接后的状态**************************/
typedef enum
{
	MCU_DATA_WRITE =0x00,     /* 写数据 */
	MCU_DATA_READ,             /* 读数据 */
}mcu_uart_data_mode_e;

/****************************创建MCU 连接后的状态**************************/
typedef  struct
{
	uint16_t len;
	uint8_t *data;
}mcu_recv_buf_typedef;

#define MCU_RECV_DATA_QUEUE_DEPTH           ( 10 )
#define MCU_RECV_DATA_RUN_WAIT_TIME         ( 3000 )
#define MCU_RECV_DATA_SLEEP_WAIT_TIME       ( 100 )


/****************************创建MCU 连接后的状态**************************/
#define MCU_CAN_CFG_BLOCK               ( 0x01 )       /*接口阻塞操作*/
#define MCU_CAN_CFG_NONBLOCK            ( 0x00 )       /*接口非阻塞操作*/

typedef enum
{   
    WRITE_PARA_FLASH = 0x01,      /*将配置参数写入到FLASH*/
    INIT_MCU_DRIVE,               /*初始化MCU 驱动*/
    RECV_CAN_DATA,                /*接收过滤CAN ID 数据*/
    UNIT_INDEX_MSG,               /*业务层下发UNIT 节点操作*/
    DTC_INDEX_MSG,                /*业务层下发DTC 节点操作*/
    POWER_CONTROL_COM,            /*系统电源控制*/           
}mcu_can_cfg_type_e;

typedef void (*mcu_can_cfg_callback_t)( mcu_can_cfg_type_e cfg_type, uint8_t index, uint8_t *data, uint16_t len , uint8_t state );

typedef  struct
{
    volatile uint8_t  type;       /*数据类型*/   
    volatile uint8_t  block;      /*数据阻塞状态*/
    /*********************/
	volatile uint16_t sn;         /*数据SN*/
	volatile uint16_t id;         /*数据ID*/
    /********************/
	volatile uint16_t len;        /*数据属性*/
	volatile void     *data;      /*数据地址*/
}mcu_can_cfg_data_t;

#define CFG_TASK_CREATE_SUCC    ( 0x01 )
#define CFG_TASK_CREATE_INIT    ( 0x00 )

#define CFG_TASK_EXIT_COMM      ( 0x01 )
#define CFG_TASK_EXIT_INIT      ( 0x00 )

typedef  struct
{   
    volatile uint8_t  create;    /*创建的状态*/
    volatile uint8_t  exit;      /*任务退出*/
    volatile uint8_t  index;     /*数据节点号*/
    volatile uint8_t  block;     /*数据阻塞状态*/
    volatile uint8_t  *data;     /*数据空间*/   
    volatile uint16_t *len;      /*数据长度指针*/
    volatile uint8_t  *state;    /*数据状态*/
}mcu_can_cfg_para_t;

#define MCU_CAN_CFG_DATA_QUEUE_DEPTH     ( 10 )
#define MCU_CAN_CFG_DATA_WAIT_TIME       ( 1000 )
#define MCU_CAN_CFG_DATA_SEND_TIME       ( 100 )

/****************************MCU 系统配置表状态*********************************/
typedef enum
{   
    CAN_CFG_FLASH_SAVE_NOT = 0x01,       /*FLASH中没有存储配置表信息*/
    CAN_CFG_FLASH_SAVE_OK,               /*FLASH中已保存配置表信息*/
}mcu_can_flash_config_status_e;


/****************************MCU PORT 控制类型*********************************/
typedef enum
{   
    PORT_CFG_INIT = 0x01,               /*端口初始化*/
    PORT_CFG_READ,                      /*端口读*/
    PORT_CFG_WRITE,                     /*端口写*/ 
}mcu_can_port_control_status_e;

/** ****************************************************************************
* @remarks       void mcu_create_task( unsigned portBASE_TYPE uxPriority )
* @brief         创建MCU基层数据处理任务
* @param[in]     uxPriority 优先级
* @param[out]    无
* @return        无
* @attention     在系统启动后进行创建
*******************************************************************************/
extern void mcu_create_task( unsigned portBASE_TYPE uxPriority );

/** ****************************************************************************
* @remarks       uint32_t mcu_uart_driver_open( mcu_uart_driver_callback_t recv_cb ,mcu_uart_state_callback_t state_cb )
* @brief         打开MCU 底层数据操作
* @param[in]     recv_cb 接收数据的回调函数 
* @param[out]    无
* @return        pdPASS 打开成功，pdFAIL打开失败
* @attention     无
*******************************************************************************/
extern uint32_t mcu_uart_driver_open( mcu_uart_driver_callback_t recv_cb ,mcu_uart_state_callback_t state_cb );

/** ****************************************************************************
* @remarks       uint32_t mcu_uart_driver_send_data(uint8_t channel, uint8_t *pbuf , uint16_t dlen )
* @brief         MCU串口发送数据
* @param[in]     *pbuf 数据源地址
* @param[in]     dlen 数据长度
* @param[out]    无
* @return        pdPASS发送成功 ，  pdFAIL发送失败
* @attention     将发送的数据消息队列中，发送给任务进行数据发送。
*******************************************************************************/
extern uint32_t mcu_uart_driver_write( uint8_t *pbuf , uint16_t dlen );

/** ****************************************************************************
* @remarks       uint32_t mcu_uart_driver_close( void)
* @brief         MCU底层串口关闭
* @param[in]     无
* @param[out]    无
* @return        pdPASS关闭成功 ，  pdFAIL关闭失败
* @attention     
*******************************************************************************/
extern uint32_t mcu_uart_driver_close( void );

/** ****************************************************************************
* @remarks       uint32_t mcu_can_cfg_data_queue_put( mcu_can_cfg_data_t *cfg )
* @brief         获取CAN CFG数据发送消息队列数据
* @param[in]     *cfg 发送的数据地址
* @param[out]    无
* @return        pdPASS 成功    pdFAIL 失败
* @attention     必须在任务中运行
*******************************************************************************/
extern uint32_t mcu_can_cfg_data_queue_put( mcu_can_cfg_data_t *cfg );

/** ****************************************************************************
* @remarks       uint32_t mcu_can_cfg_wf_handle( uint8_t *data, uint16_t len, uint32_t timeout )
* @brief         CAN CFG 参数 写入FLASH 操作接口
* @param[in]     *data 数据源地址，len 数据长度，timeout 阻塞时间，单位ms。0非阻塞。
* @param[out]    无
* @return        pdPASS 成功    pdFAIL 失败
* @attention     无
*******************************************************************************/
extern uint32_t mcu_can_cfg_wf_handle( uint8_t *data, uint16_t len, uint32_t timeout );

/** ****************************************************************************
* @remarks       uint32_t mcu_can_cfg_dev_handle( uint32_t timeout )
* @brief         CAN CFG 参数 配置驱动
* @param[in]     timeout 阻塞时间，单位ms。0非阻塞。
* @param[out]    无
* @return        pdPASS 成功    pdFAIL 失败
* @attention     无
*******************************************************************************/
extern uint32_t mcu_can_cfg_dev_handle( uint32_t timeout );

/** ****************************************************************************
* @remarks       uint32_t mcu_can_cfg_can_recv_handle( uint8_t *data, uint16_t len, uint16_t sn, uint16_t id, uint32_t timeout )
* @brief         CAN 数据接收处理
* @param[in]     *data 数据目标地址，*len 数据长度，sn序列号，id ,timeout 阻塞时间，单位ms。0非阻塞。
* @param[out]    无
* @return        pdPASS 成功，pdFAIL 失败
* @attention     无
*******************************************************************************/
extern uint32_t mcu_can_cfg_can_recv_handle( uint8_t *data, uint16_t len, uint16_t sn, uint16_t id, uint32_t timeout );

/** ****************************************************************************
* @remarks       uint32_t mcu_can_cfg_unit_index_handle( mcu_can_cfg_para_t *para, uint32_t timeout )
* @brief         CAN CFG  UNIT INDEX 数据获取
* @param[in]     index 节点，timeout 阻塞时间，单位ms。0非阻塞。
* @param[out]    *data 数据目标地址，*len数据长度目标地址，*state 数据状态目标地址
* @return        数据发送类型分为3种，数据、状态、字符；
* @attention     无
*******************************************************************************/
extern uint32_t mcu_can_cfg_unit_index_handle( uint8_t index,uint8_t *data,uint16_t *len,uint8_t *state, uint32_t timeout );

/** ****************************************************************************
* @remarks       uint32_t mcu_can_cfg_dtc_index_handle( uint8_t index,uint8_t *data,uint16_t *len,uint8_t *state, uint32_t timeout )
* @brief         CAN CFG  DTC INDEX 数据获取
* @param[in]     index 节点，timeout 阻塞时间，单位ms。0非阻塞。
* @param[out]   *data 数据目标地址，*len数据长度目标地址，*state 数据状态目标地址
* @return        数据发送类型分为3种，数据、状态、字符；
* @attention     无
*******************************************************************************/
extern uint32_t mcu_can_cfg_dtc_index_handle( uint8_t index,uint8_t *data,uint16_t *len,uint8_t *state, uint32_t timeout );

/** ****************************************************************************
* @remarks       void mcu_can_cfg_unit_index_handle_cb_set( mcu_can_cfg_callback_t  fun )
* @brief         设置UNIT INDEX 处理回调函数
* @param[in]     fun API 函数地址
* @param[out]    无
* @return        无
* @attention     无
*******************************************************************************/
extern void mcu_can_cfg_unit_index_handle_cb_set( mcu_can_cfg_callback_t  fun );

/** ****************************************************************************
* @remarks       uint32_t mcu_can_cfg_version_get( uint8_t *ver )
* @brief         获取MCU 配置表版本号
* @param[in]     *ver 读取版本号源地址
* @param[out]    无
* @return        pdPASS 成功 pdFAIL 失败
* @attention     ver 传入的地址长度大于SYS_CONFIG_VERSION_MAX_LEN
*******************************************************************************/
extern uint32_t mcu_can_cfg_version_get( uint8_t *ver );

/** ****************************************************************************
* @remarks       uint32_t mcu_can_mcu_version_get( uint8_t *version, uint32_t *len )
* @brief         获取MCU系统版本号
* @param[in]     无
* @param[out]    *version 版本号目标地址， *len 版本号长度
* @return        pdPASS成功/pdFAIL失败
* @attention     无
*******************************************************************************/
extern uint32_t mcu_can_mcu_version_get( uint8_t *version, uint32_t *len );

/** ****************************************************************************
* @remarks       uint32_t mcu_can_mcu_port_control( mcu_can_port_control_status_e port_control, mcu_port_cfg_infor_t  port_cfg , uint16_t *out )
* @brief         MCU PORT 控制操作
* @param[in]     port_control 控制类型；port_cfg 端口配置
* @param[out]    *out 数据输出：
* @return        pdPASS成功/pdFAIL失败
* @attention     out 数据输出，为OUTPUT 时返回控制状态，INPUT 输入状态，ADC 数据
*******************************************************************************/
extern uint32_t mcu_can_mcu_port_control( mcu_can_port_control_status_e port_control, mcu_port_cfg_infor_t port_cfg , uint16_t *out );

#endif

